package com.hzw.saas.common.util;

import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;

import cn.hutool.core.util.StrUtil;

/**
 * @author zzl
 * @since 04/26/2021
 */
public class LambdaUtil {

    public static <T> String getFieldName(PropertyFunc<T, ?> func){
        try {
            // 通过获取对象方法，判断是否存在该方法
            Method method = func.getClass().getDeclaredMethod("writeReplace");
            method.setAccessible(true);
            // 利用jdk的SerializedLambda 解析方法引用
            SerializedLambda serializedLambda = (SerializedLambda) method.invoke(func);
            String getter = serializedLambda.getImplMethodName();
            return resolveFieldName(getter);
        } catch (ReflectiveOperationException e) {
            throw new RuntimeException(e);
        }
    }

    private static String resolveFieldName(String getMethodName) {
        if (getMethodName.startsWith("get")) {
            getMethodName = getMethodName.substring(3);
        } else if (getMethodName.startsWith("is")) {
            getMethodName = getMethodName.substring(2);
        }
        // 小写第一个字母
        return StrUtil.lowerFirst(getMethodName);
    }


}
